package com.atguigu.gmall;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 李旭
 * @date 2021/11/20 16:17
 * @Description:
 *
 *   异步编排    线程间通信
 *
 *   多线程  JUC课程上
 *
 *
 */
public class CompletableFutureDemo2 {


    public static void main(String[] args) throws Exception{
        //自定义线程池
        ThreadPoolExecutor threadPoolExecutor = new
                ThreadPoolExecutor(
                    5,//核心线程
                    10,//最大线程数
                    3,
                 TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10)
        );
        // 串行化线程
        //1、开启一个新的线程
        CompletableFuture.supplyAsync(() -> {//上一个任务
            try {
                TimeUnit.SECONDS.sleep(4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("上一个任务：" + Thread.currentThread().getName());
            return "我是上一个任务";
        },threadPoolExecutor).thenApplyAsync((t) -> {//当前任务
            try {
                TimeUnit.SECONDS.sleep(4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("上一个任务的返回值：t:" + t);
            System.out.println("当前任务：" +Thread.currentThread().getName());
            return "我是当前任务";
        },threadPoolExecutor).thenAcceptAsync((t) -> {//下一个任务
            System.out.println("当前任务的返回值：t:" + t);
            System.out.println("下一个任务：" +Thread.currentThread().getName());
        },threadPoolExecutor).thenRunAsync(() -> {//下下一个任务   执行后继操作  不接收上一个任务的返回  也不返回
            System.out.println("下下一个任务：" +Thread.currentThread().getName());
        },threadPoolExecutor);

        //2、再开启一个任务
        CompletableFuture.runAsync(() -> {
            System.out.println("再开启一个任务:" + Thread.currentThread().getName());
        },threadPoolExecutor);



    }
}
